import axios, { type AxiosResponse, type AxiosRequestConfig } from "axios";
import qs from "qs";
import NProgress from "nprogress";
import { useUserStore } from "@/stores/admin/index";
import cookie from 'js-cookie'
import router from '@/router'//路由

// 通过继承的方式扩展AxiosResponse类型，增加需要的字段
declare interface TypeResponse extends AxiosResponse {
    /**
     * 错误号，200:成功,10006:令牌过期
     */
    errno: number,
    /**
     * 返回的信息
     */
    errmsg: string
}

let baseURL = '';

// process.env  node中的一个环境对象,其中保存着系统环境的变量信息
// NODE_ENV 自定义的变量主要用于标识当前的环境,判断生产环境或开发环境

// development  开发环境
// production 生产环境
if (process.env.NODE_ENV === 'development') {
    baseURL = '/m.api';
} else {
    baseURL = 'http://zxwyit.cn:8080';
}

const instance = axios.create({
    baseURL,
    headers: { 'content-type': 'application/x-www-form-urlencoded' }
})

// 添加请求拦截器
instance.interceptors.request.use((config: AxiosRequestConfig): AxiosRequestConfig => {
    // 在发送请求之前做些什么
    if (config.headers) {
        config.headers['AdminToken'] = cookie.get('token') + '';
        NProgress.start();
    }
    return config;
}, (error) => {
    // 对请求错误做些什么
    console.log('请求错误', error);
    return Promise.reject(error);
});

const METHOD_TYPE = ['_mt=edit', '_mt=create', '_mt=delete'];//无感刷新的操作类型

// 添加响应拦截器
instance.interceptors.response.use(async (response: AxiosResponse) => {
    // 对响应数据做点什么
    NProgress.done()
    let data = response.data;
    let { errno } = data;
    let path = router.currentRoute.value.fullPath;
    if (10006 === errno) { //状态码:10006,管理员尚未登录
        const configData = response.config.data || ''; //获取接口请求的数据
        var index = METHOD_TYPE.findIndex(item => configData.includes(item));
        if (-1 === index) {
            router.replace({ path: '/login', query: { back: path } }); //登录后需要跳回的路径
            return
        } else {
            const store = useUserStore();
            let loginData = { _gp: "admin", _mt: "login", ...store.loginInfo }; //登录数据
            const { data, errno, errmsg } = await post(loginData); //请求登录数据,重新加载token头
            if (200 == errno) {
                cookie.set('token', data);
            } else {
                router.replace({ path: '/login', query: { back: path } });
                return Promise.reject({ data, errno, errmsg });
            }
            return instance.request(response.config); //重新发送请求
        }
    }
    return data;
}, (error) => {
    // 对响应错误做点什么
    console.log('请求错误', error);
    return Promise.reject(error);
});

// 封装get,post请求
export const get = (params?: object): Promise<TypeResponse> => {
    return instance.get('', { params })
}
// qs.stringify将对象序列化成url的形式,以&字符进行拼接
export const post = (data: object, params?: object): Promise<TypeResponse> => {
    return instance.post('', qs.stringify(data), { params })
}
/**
 * 上传图片
 * @param data 图片数据
 * @returns 
 */
export const upload = (data: FormData): Promise<TypeResponse> => {
    return instance.post('http://192.168.1.188:8080/upload/admin', data) //..表示上一级目录
}